package com.zhulei.biji.suanfa.pace;

import java.util.HashMap;
import java.util.LinkedList;

/**
 * @description:
 * @author: zhulei
 * @create: 2025-03-12 17:32
 **/
public class CountOfSubstrings {
    /**
     * 给你一个字符串 word 和一个 非负 整数 k。
     *
     * 返回 word 的 子字符串 中，每个元音字母（'a'、'e'、'i'、'o'、'u'）至少 出现一次，并且 恰好 包含 k 个辅音字母的子字符串的总数。
     *
     * 示例 1：
     *
     * 输入：word = "aeioqq", k = 1
     *
     * 输出：0
     *
     * 解释：
     *
     * 不存在包含所有元音字母的子字符串。
     *
     * 示例 2：
     *
     * 输入：word = "aeiou", k = 0
     *
     * 输出：1
     *
     * 解释：
     *
     * 唯一一个包含所有元音字母且不含辅音字母的子字符串是 word[0..4]，即 "aeiou"。
     *
     * 示例 3：
     *
     * 输入：word = "ieaouqqieaouqq", k = 1
     *
     * 输出：3
     *
     * 解释：
     *
     * 包含所有元音字母并且恰好含有一个辅音字母的子字符串有：
     *
     * word[0..5]，即 "ieaouq"。
     * word[6..11]，即 "qieaou"。
     * word[7..12]，即 "ieaouq"。
     * 提示：
     *
     * 5 <= word.length <= 250
     * word 仅由小写英文字母组成。
     * 0 <= k <= word.length - 5
     * Related Topics
     * 哈希表
     * 字符串
     * 滑动窗口
     *
     * 👍 34
     * 👎 0
     */
    public static void main(String[] args) {
        System.out.println(countOfSubstrings2("ieaouqqieaouqq",1));
    }

    public static int countOfSubstrings2(String word, int k) {
        return f(word,k)-f(word,k+1);
    }

    public static int f(String word, int k) {
        char[] chars = word.toCharArray();
        HashMap<Character, Integer> cnt1 = new HashMap<>();
        int left=0,right=0,wNum=0,anw=0;
        for (; right < chars.length; right++) {
            if (isW(chars[right]))
                wNum++;
            else
                cnt1.merge(chars[right], 1, Integer::sum);
            while (cnt1.size() == 5 && wNum >= k){
                if (isW(chars[left]))
                    wNum--;
                else{
                    if (cnt1.merge(chars[left], -1, Integer::sum) == 0)
                        cnt1.remove(chars[left]);
                }
                left++;
            }
            anw += left;
        }
        return anw;
    }

    public static int countOfSubstrings(String word, int k) {
        int[] ary = {0,0,0,0,0};
        int anw = 0,temp = 0;
        char[] chars = word.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            for (int j = i; j < chars.length; j++) {
                if (chars[j] != 'a' && chars[j] != 'e' && chars[j] != 'i' && chars[j] != 'o' && chars[j] != 'u')
                    temp++;
                if(isSatisfy(ary,chars[j])==5 && temp==k){
                    anw++;
                }
                if (temp>k){
                    break;
                }
            }
            temp=0;
            ary = resetAry(ary);
        }
        return anw;
    }
    public static int[] resetAry(int[] ary){
        for (int i = 0; i < ary.length; i++) {
            ary[i]=0;
        }
        return ary;
    }
    public static int isSatisfy(int[] ary ,char c) {
        int result = 0;
        switch (c){
            case 'a':
                ary[0] = 1;
                break;
            case 'e':
                ary[1] = 1;
                break;
            case 'i':
                ary[2] = 1;
                break;
            case 'o':
                ary[3] = 1;
                break;
            case 'u':
                ary[4] = 1;
                break;
        }
        for (int i:
        ary) {
            result+=i;
        }
        return result;
    }

    public static void sout(char[] chars , int i,int j){
        for (int k = i; k <= j; k++) {
            System.out.print(chars[k]);
        }
        System.out.println();
    }

    public static boolean isW(char c) {
        return c != 'a' && c != 'e' && c != 'i' && c != 'o' && c != 'u';
    }

    public static boolean isSatisfy3(int[] ary ,char c) {
        switch (c){
            case 'a':
                if (ary[0] - 1 <=0 )
                    return false;
                else
                    ary[0] -= 1;
                break;
            case 'e':
                if (ary[1] - 1 <=0 )
                    return false;
                else
                    ary[1] -= 1;
                break;
            case 'i':
                if (ary[2] - 1 <=0 )
                    return false;
                else
                    ary[2] -= 1;
                break;
            case 'o':
                if (ary[3] - 1 <=0 )
                    return false;
                else
                    ary[3] -= 1;
                break;
            case 'u':
                if (ary[4] - 1 <=0 )
                    return false;
                else
                    ary[4] -= 1;
                break;
        }
        return true;
    }

    public static boolean isSatisfy2(int[] ary ,char c) {
        switch (c){
            case 'a':
                ary[0] += 1;
                break;
            case 'e':
                ary[1] += 1;
                break;
            case 'i':
                ary[2] += 1;
                break;
            case 'o':
                ary[3] += 1;
                break;
            case 'u':
                ary[4] += 1;
                break;
        }
        for (int i:
                ary) {
            if (i<=0)
                return false;
        }
        return true;
    }


}
